home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / pluginy Firefox / 53142 / 53142.xpi / content / options.js < prev    next >
Text File  |  2009-12-07  |  12KB  |  331 lines

  1. /*##########################################################################
  2.     Copyright 2009 Tim Reid
  3.  
  4.     This file is part of the Stack Overflow Reputation Display extension
  5.     for Mozilla Firefox.
  6.  
  7.     Stack Overflow Reputation Display is free software: you can
  8.     redistribute it and/or modify it under the terms of the GNU General
  9.     Public License as published by the Free Software Foundation, either
  10.     version 3 of the License, or (at your option) any later version.
  11.  
  12.     Stack Overflow Reputation Display is distributed in the hope that it
  13.     will be useful, but WITHOUT ANY WARRANTY; without even the implied
  14.     warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  15.     See the GNU General Public License for more details.
  16.  
  17.     You should have received a copy of the GNU General Public
  18.     License along with Stack Overflow Reputation Display. If not,
  19.     see <http://www.gnu.org/licenses/>.
  20. ##########################################################################*/
  21.  
  22. var sorepoptions = {
  23.   interfaces: {
  24.     prefs:   Components.classes["@mozilla.org/preferences-service;1"]
  25.                        .getService(Components.interfaces.nsIPrefService)
  26.                        .getBranch("extensions.sorepdisplay."),
  27.     console: Components.classes["@mozilla.org/consoleservice;1"]
  28.                        .getService(Components.interfaces.nsIConsoleService),
  29.   },
  30.  
  31.   doCancel: function () {
  32.     window.close();
  33.   },
  34.  
  35.   doOK: function () {
  36.     var configs = [];
  37.     for (var i=0; i<this.accounts.length; i++)
  38.       configs.push(this.accounts[i].config);
  39.  
  40.     this.interfaces.prefs.setCharPref("config", configs.join(","));
  41.  
  42.     if (this.reputationtextcolor != this.interfaces.prefs.getCharPref("reputationtextcolor"))
  43.       this.interfaces.prefs.setCharPref("reputationtextcolor", this.reputationtextcolor);
  44.     if (this.badgetextcolor != this.interfaces.prefs.getCharPref("badgetextcolor"))
  45.       this.interfaces.prefs.setCharPref("badgetextcolor", this.badgetextcolor);
  46.   },
  47.  
  48.   nsResolver: function (prefix) {
  49.     var ns = {
  50.       'xul': 'http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul'
  51.     };
  52.  
  53.     return ns[prefix] || null;
  54.   },
  55.  
  56.   menuselect: function (menu, attribute, value) {
  57.     var result = menu.ownerDocument
  58.                      .evaluate('.//xul:menuitem[@' + attribute + '="' + value + '"]',
  59.                                menu,
  60.                                this.nsResolver,
  61.                                XPathResult.FIRST_ORDERED_NODE_TYPE,
  62.                                null);
  63.     if (result && result.singleNodeValue) {
  64.       menu.selectedItem = result.singleNodeValue;
  65.       return true;
  66.     }
  67.  
  68.     return false;
  69.   },
  70.  
  71.   select: function (e) {
  72.     var index = e.target.selectedIndex;
  73.     this.selectedaccount = this.accounts[index];
  74.     this.updatedisplay();
  75.   },
  76.  
  77.   updatesite: function () {
  78.     var sitemenu = document.getElementById("site");
  79.     this.menuselect(sitemenu, "value", this.selectedaccount.site.sitetag);
  80.   },
  81.  
  82.   updateuser: function () {
  83.     var userlabel = document.getElementById("userlabel");
  84.     var clearbutton = document.getElementById("clear");
  85.     clearbutton.setAttribute("disabled", "false");
  86.  
  87.     var name = this.selectedaccount.name;
  88.     var user = this.selectedaccount.user;
  89.  
  90.     var text;
  91.     userlabel.setAttribute("disabled", "false");
  92.     if (user && name) {
  93.       text = name + " (" + user + ")";
  94.     } else if (user) {
  95.       text = user;
  96.     } else {
  97.       text = "login to website to set user";
  98.       clearbutton.setAttribute("disabled", "true");
  99.       userlabel.setAttribute("disabled", "true");
  100.     }
  101.     userlabel.setAttribute("value", text);
  102.   },
  103.  
  104.   updateinterval: function () {
  105.     var intervalmenu = document.getElementById("interval");
  106.     while (intervalmenu.firstChild)
  107.       intervalmenu.removeChild(intervalmenu.firstChild);
  108.  
  109.     var p = document.createElement("menupopup");
  110.     intervalmenu.appendChild(p);
  111.     for (var i=0; i<this.selectedaccount.site.intervals.length; i++) {
  112.       var mi = document.createElement("menuitem");
  113.       mi.setAttribute("value", this.selectedaccount.site.intervals[i].value);
  114.       mi.setAttribute("label", this.selectedaccount.site.intervals[i].description);
  115.       p.appendChild(mi);
  116.     }
  117.     this.menuselect(intervalmenu, "value", "900");
  118.     this.menuselect(intervalmenu, "label", intervalmenu.getAttribute("label"));
  119.     this.menuselect(intervalmenu, "value", this.selectedaccount.updateinterval);
  120.   },
  121.  
  122.   updateaction: function () {
  123.     var actionmenu = document.getElementById("clickaction");
  124.     while (actionmenu.firstChild)
  125.       actionmenu.removeChild(actionmenu.firstChild);
  126.  
  127.     var p = document.createElement("menupopup");
  128.     actionmenu.appendChild(p);
  129.     for (var i=0; i<this.selectedaccount.site.bookmarks.length; i++) {
  130.       var mi = document.createElement("menuitem");
  131.       mi.setAttribute("value", this.selectedaccount.site.bookmarks[i]);
  132.       mi.setAttribute("label", this.selectedaccount.site
  133.                                    .pages[this.selectedaccount.site
  134.                                               .bookmarks[i]].description);
  135.       p.appendChild(mi);
  136.     }
  137.     this.menuselect(actionmenu, "label", actionmenu.getAttribute("label"));
  138.     this.menuselect(actionmenu, "value", this.selectedaccount.clickaction);
  139.   },
  140.  
  141.   updatedosounds: function () {
  142.     var dosoundsbox = document.getElementById("dosounds");
  143.  
  144.     if (this.selectedaccount.dosounds)
  145.       dosoundsbox.setAttribute("checked", "true");
  146.     else
  147.       dosoundsbox.removeAttribute("checked");
  148.   },
  149.  
  150.   updatedisplay: function () {
  151.     this.updatesite();
  152.     this.updateuser();
  153.     this.updateinterval();
  154.     this.updateaction();
  155.     this.updatedosounds();
  156.   },
  157.  
  158.   siteselected: function (e) {
  159.     this.selectedaccount.site = new SOSite(e.target.value);
  160.     var listbox = document.getElementById("listbox");
  161.     var i = listbox.selectedIndex;
  162.     this.filllistbox();
  163.     listbox.selectedIndex = i;
  164.   },
  165.  
  166.   intervalselected: function (e) {
  167.     this.selectedaccount.updateinterval = parseInt(e.target.value);
  168.   },
  169.  
  170.   actionselected: function (e) {
  171.     this.selectedaccount.clickaction = e.target.value;
  172.   },
  173.  
  174.   soundselected: function (e) {
  175.     this.selectedaccount.dosounds = e.target.checked;
  176.   },
  177.  
  178.   clearaction: function (e) {
  179.     this.selectedaccount.user = null;
  180.     this.updateuser(this.selectedaccount);
  181.   },
  182.  
  183.   deleteaction: function (e) {
  184.     var listbox = document.getElementById("listbox");
  185.     var i = listbox.selectedIndex;
  186.     if (i >= 0) {
  187.       this.accounts.splice(i, 1);
  188.       this.filllistbox();
  189.       if (this.accounts.length >= i+1)
  190.         listbox.selectedIndex = i;
  191.       else
  192.         listbox.selectedIndex = this.accounts.length - 1;
  193.     }
  194.   },
  195.  
  196.   addaction: function (e) {
  197.     this.accounts.push(new SOAccount("so"));
  198.     this.filllistbox();
  199.     var listbox = document.getElementById("listbox");
  200.     listbox.selectedIndex = this.accounts.length - 1;
  201.   },
  202.  
  203.   repcoloraction: function (e) {
  204.     if (e.target.style.backgroundColor) {
  205.       this.interfaces
  206.           .console
  207.           .logStringMessage("SORepdisplay options reputation score text colour selected: " + e.target.style.backgroundColor);
  208.       document.getElementById("repcolorpicker-mp").hidePopup();
  209.       this.reputationtextcolor = e.target.style.backgroundColor;
  210.       this.reptextcolorswatch.style.backgroundColor = this.reputationtextcolor;
  211.     }
  212.   },
  213.  
  214.   badgecoloraction: function (e) {
  215.     if (e.target.style.backgroundColor) {
  216.       this.interfaces
  217.           .console
  218.           .logStringMessage("SORepdisplay options badge count text colour selected: " + e.target.style.backgroundColor);
  219.       document.getElementById("badgecolorpicker-mp").hidePopup();
  220.       this.badgetextcolor = e.target.style.backgroundColor;
  221.       this.badgetextcolorswatch.style.backgroundColor = this.badgetextcolor;
  222.     }
  223.   },
  224.  
  225.   filllistbox: function () {
  226.     var listbox = document.getElementById("listbox");
  227.     while (listbox.firstChild)
  228.       listbox.removeChild(listbox.firstChild);
  229.  
  230.     for (var i=0; i<this.accounts.length; i++) {
  231.       var r = document.createElement("richlistitem");
  232.       var m = document.createElement("image");
  233.       m.setAttribute("height", 16);
  234.       m.setAttribute("width", 16);
  235.       m.setAttribute("src", this.accounts[i].site.smallicon);
  236.       r.appendChild(m);
  237.  
  238.       var l = document.createElement("label");
  239.       l.setAttribute("flex", 1);
  240.       l.setAttribute("crop", "end");
  241.       l.setAttribute("value", this.accounts[i].site.title);
  242.       r.appendChild(l);
  243.  
  244.       listbox.appendChild(r);
  245.     }
  246.   },
  247.  
  248.   fillsitebox: function () {
  249.     var sitebox = document.getElementById("site");
  250.     while (sitebox.firstChild)
  251.       sitebox.removeChild(sitebox.firstChild);
  252.  
  253.     var p = document.createElement("menupopup");
  254.     sitebox.appendChild(p);
  255.     for (var i=0; i<this.sites.length; i++) {
  256.       var mi = document.createElement("menuitem");
  257.       mi.setAttribute("value", this.sites[i].tag);
  258.       mi.setAttribute("label", this.sites[i].title);
  259.       p.appendChild(mi);
  260.     }
  261.   },
  262.  
  263.   init: function () {
  264.     var me = this;
  265.  
  266.     var config = this.interfaces.prefs.getCharPref("config");
  267.     var configparts = config.split(/,/);
  268.     var accounts = [];
  269.     for (var i=0; i<configparts.length; i++) {
  270.       if (configparts[i][0] == "#")
  271.         continue;
  272.  
  273.       var account = new SOAccount(configparts[i]);
  274.       accounts.push(account);
  275.     }
  276.     this.accounts = accounts;
  277.  
  278.     this.sites = [];
  279.     for (var i=0; i<SOSite.siteinfo.length; i+=2)
  280.       this.sites.push({
  281.                         tag:   SOSite.siteinfo[i],
  282.                         title: SOSite.siteinfo[i+1].title,
  283.                       });
  284.  
  285.     this.filllistbox();
  286.     this.fillsitebox();
  287.  
  288.     var listbox = document.getElementById("listbox");
  289.     listbox.addEventListener("select", function (e) { me.select(e); }, true);
  290.     listbox.selectedIndex = 0;
  291.  
  292.     var siteselector = document.getElementById("site");
  293.     siteselector.addEventListener("command", function (e) { me.siteselected(e); }, true);
  294.  
  295.     var intervalselector = document.getElementById("interval");
  296.     intervalselector.addEventListener("command", function (e) { me.intervalselected(e); }, true);
  297.  
  298.     var actionselector = document.getElementById("clickaction");
  299.     actionselector.addEventListener("command", function (e) { me.actionselected(e); }, true);
  300.  
  301.     var soundselector = document.getElementById("dosounds");
  302.     soundselector.addEventListener("command", function (e) { me.soundselected(e); }, true);
  303.  
  304.     var clearbutton = document.getElementById("clear");
  305.     clearbutton.addEventListener("command", function (e) { me.clearaction(e); }, true);
  306.  
  307.     var addbutton = document.getElementById("add");
  308.     addbutton.addEventListener("command", function (e) { me.addaction(e); }, true);
  309.  
  310.     var deletebutton = document.getElementById("delete");
  311.     deletebutton.addEventListener("command", function (e) { me.deleteaction(e); }, true);
  312.  
  313.     this.reputationtextcolor = this.interfaces.prefs.getCharPref("reputationtextcolor");
  314.     this.reptextcolorswatch = document.getElementById("repcolorpicker-hb");
  315.     this.reptextcolorswatch.style.backgroundColor = this.reputationtextcolor;
  316.  
  317.     this.badgetextcolor = this.interfaces.prefs.getCharPref("badgetextcolor");
  318.     this.badgetextcolorswatch = document.getElementById("badgecolorpicker-hb");
  319.     this.badgetextcolorswatch.style.backgroundColor = this.badgetextcolor;
  320.  
  321.     var repmp = document.getElementById("repcolorpicker-mp");
  322.     repmp.addEventListener("click", function (e) { me.repcoloraction(e); }, true);
  323.     var badgemp = document.getElementById("badgecolorpicker-mp");
  324.     badgemp.addEventListener("click", function (e) { me.badgecoloraction(e); }, true);
  325.   },
  326.  
  327.   null: null
  328. };
  329.  
  330. window.addEventListener("load", function (e) { sorepoptions.init(); }, false);
  331.